/*
 * jPOS' miniSpace
 * Copyright (C) 2000-2006 Alejandro Revilla
 * jPOS.org (http://jpos.org)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
 * USA
 *
 */

package org.jpos.space;


/**
 * <p><b>Space</b> uses concepts described in the Linda Coordination Language 
 * that eases the implementation of other jPOS components (such as 
 * Channels, Muxes, etc.), but it is not by any means an attempt to provide
 * a full implementation.</p>
 *
 * <p>jPOS's Space is basically a Map where each entry is a LinkedList 
 * of values that can be used as a BlockingQueue</p>
 *
 * <p>One can place entries on a queue by calling Space.out, take them
 * by calling Space.in and read (without taking) by calling Space.rd</p>
 *
 * @author Alejandro Revilla
 * @version $Revision: 1717 $ $Date: 2003-10-01 10:17:49 -0300 (Wed, 01 Oct 2003) $
 * @since 2.0
 * @see TSpace
 * @see SpaceError
 */

public interface Space {
    /**
     * Write a new entry into the Space
     * @param key Entry's key
     * @param value Object value
     */
    public void out (Object key, Object value);

    /**
     * Write a new entry into the Space, with an timeout value
     * @param key Entry's key
     * @param value Object value
     * @param timeout timeout value
     */
    public void out (Object key, Object value, long timeout);

    /**
     * Take an entry from the space, waiting forever until one exists.
     * @param key Entry's key
     * @return value
     */
    public Object in  (Object key);

    /**
     * Read an entry from the space, waiting forever until one exists.
     * @param key Entry's key
     * @return value
     */
    public Object rd  (Object key);

    /**
     * Take an entry from the space, waiting a limited amount of time
     * until one exists.
     * @param key Entry's key
     * @param timeout millis to wait
     * @return value or null
     */
    public Object in  (Object key, long timeout);


    /**
     * Read an entry from the space, waiting a limited amount of time
     * until one exists.
     * @param key Entry's key
     * @param timeout millis to wait
     * @return value or null
     */
    public Object rd  (Object key, long timeout);


    /**
     * In probe takes an entry from the space if one exists, 
     * return null otherwise.
     * @param key Entry's key
     * @return value or null
     */
    public Object inp (Object key);


    /**
     * Read probe reads an entry from the space if one exists, 
     * return null otherwise.
     * @param key Entry's key
     * @return value or null
     */
    public Object rdp (Object key);
}

